﻿using System;
using SoftwareConsulting.BI11.NumericalMethods.Interfaces;

namespace SoftwareConsulting.BI11.NumericalMethods.Iterations
{    
    /// <summary>
    /// Класс итератора по одно-аргументной функции
    /// </summary>
    public abstract class FunctionalIterator : IterativeProcess
    {        
        private double _bestZeroApproximation;//наилучшее приближение нуля        
        private IOneVariableFunction _function;//рассматриваемая функция

        /// <summary>
        /// Конструктор класса
        /// </summary>
        /// <param name="function">рассматриваемая функция</param>
        public FunctionalIterator(IOneVariableFunction function)
        {
            Function = function;
            _bestZeroApproximation = double.NaN;    
        }

        /// <summary>
        /// Возвращает наилучшее приближение нуля
        /// </summary>
        public double BestZeroApproximation
        {
            get 
            { 
                return _bestZeroApproximation; 
            }
        }

        /// <summary>
        /// Устанавливает наилучшее приближение нуля
        /// </summary>
        /// <param name="best"></param>
        protected void SetBestZeroApproximation(double best)
        {
            _bestZeroApproximation = best;
        }

        /// <summary>
        /// Возвращает относительную погрешность
        /// </summary>
        /// <param name="epsilon"></param>
        /// <returns></returns>
        public double GetRelativeError(double epsilon)
        {
            return GetRelativeError(epsilon, Math.Abs(_bestZeroApproximation));
        }

        /// <summary>
        /// Возвращает/устанавливает рассматриваемую функцию
        /// </summary>
        public virtual IOneVariableFunction Function
        {
            get
            {
                return _function;
            }
            set 
            { 
                _function = value; 
            }
        }

        /// <summary>
        /// Возвращает/устанавливает стартовое значение наилучшего приближения нуля функции
        /// </summary>
        public double InitialBestZeroApproximation
        {
            get
            {
                return _bestZeroApproximation;
            }
            set 
            {
                _bestZeroApproximation = value; 
            }
        }
    }
}
